#include "sysdefs.h"

void trataAlarme(){
	printf("SO_Shutdown: TRATANDO ALARME.\n");
}

int main(){
	int idFila;
	intMsg idSchedule,progFinalizados;

	signal(SIGALRM,trataAlarme);

	/*Obtencao da Fila de Mensagem compartilhada com Schedule*/
	if((idFila = msgget(CHAVE_FILA_SCHEDULE_SHUTDOWN,0x1ff))<0){
		printf("SO_SHUTDOWN: ERRO NA OBTENCAO DA FILA DE MENSAGEM\n");
		exit(1);
	}
	/*Shutdown recebe o id do Schedule para passar os Sinais*/
	if(msgrcv(idFila,&idSchedule,sizeof(intMsg)-sizeof(long),0,IPC_NOWAIT)<0){
		printf("ERRO SO_SHUDOWN: NAO HA MENSAGEM DO SCHEDULE\n");
		exit(1);
	}

	alarm(120);/*Espera 2 minutos pela msg de termino de todos os processos*/
	printf("ESPERANDO FINALIZAR PROCESSOS DA TABELA\n");
	kill(idSchedule.intMsg,SIGUSR1);/*Manda o Sinal de Proibir novos Processos*/
	if(msgrcv(idFila,&progFinalizados,sizeof(intMsg)-sizeof(long),0,0)==-1){/*Espera msg - Terminou todos os processos*/
		printf("TEMPO EXCEDIDO: PROCESSOS SERAO ENCERRADOS IMEDIATAMENTE\n");
		kill(idSchedule.intMsg,SIGUSR2);/*Caso nao termine todos os processos em 2 minutos manda o Sinal de Matar todos os processos*/
	} else {
		alarm(0);
	}
	printf("PROCESSOS ENCERRADOS: DESALOCANDO FILAS\n");
	kill(idSchedule.intMsg,SIGUSR1);/*Manda o Sinal de Finalizacao das Filas para encerrar o loop*/
	return 0;
}
